package com.restkeeper.service;

import cn.hutool.json.JSONArray;
import com.alibaba.cloudapi.sdk.model.ApiResponse;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.restkeeper.config.WeChatConfig;
import com.restkeeper.config.WechatTemplate;
import com.restkeeper.constants.WXTemplateIdEum;
import com.restkeeper.model.wx.SendMessageDto;
import com.restkeeper.utils.Result;
import com.restkeeper.utils.ResultCode;
import com.restkeeper.utils.Snowflake;
import com.restkeeper.utils.http.HttpUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.*;

@RequiredArgsConstructor
@Service
@RefreshScope
@Slf4j
public class WeChatSendServiceImpl implements WeChatSendService{
    private final CommonService commonService;
    private final WeChatConfig weChatConfig;

    @Override
    public Result sendWxMsg(String sendData) {
        if (StringUtils.isNotBlank(sendData)){
            JSONObject retToken = commonService.ACCESS_TOKEN();
            String accessToken = String.valueOf(retToken.get("access_token"));
            log.info("获取access_token，微信平台接口返回{}", accessToken);
            String retInfo = HttpUtils.sendPost(weChatConfig.getSEND_TEMPLATE_MESSAGE_URL().replace("ACCESS_TOKEN",accessToken),sendData);
            log.info("消息模板返回{}", retInfo);
            JSONObject res=JSONObject.parseObject(retInfo);
            Integer errcode = (Integer) res.get("errcode");
            if (errcode != null && errcode==0){
                return Result.ok(retInfo);
            }else {
                log.info("========================微信模板消息发送失败=============================={}",retInfo);
                return Result.error(ResultCode.send_failed,"发送失败");
            }
        }
        return Result.error(ResultCode.parameter_null,"发送失败,请检查参数是否正确");
    }

    @Override
    public String bindingSuccess(SendMessageDto dto) {
        String templateId= WXTemplateIdEum.getCodeByName(dto.getSendKey());
        if(StringUtils.isNotBlank(templateId) && StringUtils.isNotBlank(dto.getOpenid())){
//            DeviceUser deviceUser = deviceUserDao.selectById(dto.getUserId());
//            if(deviceUser==null){
//                return null;
//            }
            //模板消息详情跳转URL
            String url = "http://douduo.wfzwl.cn/";
            JSONObject params = new JSONObject();
            //根据具体模板参数组装
            params.put("time", WechatTemplate.item(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),"#000000"));
            params.put("imei", WechatTemplate.item(dto.getSerialNumber(),"#000000"));
            WechatTemplate wechatTemplate = new WechatTemplate();
            wechatTemplate.setTemplate_id(templateId);
            wechatTemplate.setTouser(dto.getOpenid());
            wechatTemplate.setUrl(url);
            wechatTemplate.setData(params);
            String sendData = wechatTemplate.toString();
            log.info("板参数组装{}", sendData);
            return sendData;
        }
        return null;
    }

    @Override
    public String recharge_annual(SendMessageDto dto,JSONObject params) {
        String templateId= WXTemplateIdEum.getCodeByName(dto.getSendKey());
        if(StringUtils.isNotBlank(templateId) && StringUtils.isNotBlank(dto.getOpenid())){
            WechatTemplate wechatTemplate = new WechatTemplate();
            wechatTemplate.setTemplate_id(templateId);
            wechatTemplate.setTouser(dto.getOpenid());
            wechatTemplate.setData(params);
            String sendData = wechatTemplate.toString();
            log.info("板参数组装{}", sendData);
            return sendData;
        }
        return null;
    }

    @Override
    public String recharge_balance(SendMessageDto dto,JSONObject params) {
        String templateId= WXTemplateIdEum.getCodeByName(dto.getSendKey());
        if(StringUtils.isNotBlank(templateId) && StringUtils.isNotBlank(dto.getOpenid())){
            WechatTemplate wechatTemplate = new WechatTemplate();
            wechatTemplate.setTemplate_id(templateId);
            wechatTemplate.setTouser(dto.getOpenid());
            wechatTemplate.setData(params);
            String sendData = wechatTemplate.toString();
            log.info("板参数组装{}", sendData);
            return sendData;
        }
        return null;
    }

    @Override
    public String bindingFailed(SendMessageDto dto) {
        String templateId= WXTemplateIdEum.getCodeByName("binding_failed");
        if(StringUtils.isNotBlank(templateId) && StringUtils.isNotBlank(dto.getOpenid())){
            //模板消息详情跳转URL
            JSONObject params = new JSONObject();
            //根据具体模板参数组装
            params.put("content", WechatTemplate.item(dto.getContent(),"#000000"));
            WechatTemplate wechatTemplate = new WechatTemplate();
            wechatTemplate.setTemplate_id(templateId);
            wechatTemplate.setTouser(dto.getOpenid());
            wechatTemplate.setData(params);
            String sendData = wechatTemplate.toString();
            log.info("板参数组装{}", sendData);
            return sendData;
        }
        return null;
    }

    @Override
//    @Transactional(rollbackFor = Exception.class)
    public Result police(SendMessageDto dto) {
        log.info("----------------------------进入发送消息-------------------------");
        log.info("==========================SendMessageDto{}",dto);
        if(StringUtils.isBlank(dto.getSerialNumber())){
            return null;
        }

        String templateId= WXTemplateIdEum.getCodeByName("alarm");
        //发送微信模板通知消息
//        if(StringUtils.isNotBlank(templateId) && deviceEntityVo.getIsWx()){
//            log.info("----------------------------开始发送微信模板消息-------------------------");
//            //模板消息详情跳转URL
//            JSONObject params = new JSONObject();
//            //根据具体模板参数组装
//            //设备名称
//            params.put("thing14", WechatTemplate.item(deviceEntityVo.getDeviceName(),"#000000"));
//            //设备编号
//            params.put("character_string8", WechatTemplate.item(deviceEntityVo.getSerialNumber(),"#000000"));
//            String thing5="电量:"+dto.getDumpEnergy()+",信号:"+dto.getSignalStrength()+",余额:"+deviceEntityVo.getBalance().toString();
//            //报警内容
//            params.put("thing5", WechatTemplate.item(thing5,"#000000"));
//            //报警时间
//            params.put("time4", WechatTemplate.item(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),"#000000"));
//
//            WechatTemplate wechatTemplate = new WechatTemplate();
//            wechatTemplate.setTemplate_id(templateId);
//            wechatTemplate.setTouser(deviceEntityVo.getOpenid());
//            wechatTemplate.setData(params);
//            String sendData = wechatTemplate.toString();
//            log.info("板参数组装{}", sendData);
//            sendWxMsg(sendData);
//            log.info("----------------------------微信通知完成-------------------------");
//           saveNoticeRecord(dto, deviceEntityVo, 0, sendData);
//        }
//        //设备余额
//        BigDecimal balance=deviceEntityVo.getBalance()==null?BigDecimal.ZERO:deviceEntityVo.getBalance();
//        if (balance.compareTo(BigDecimal.ZERO)>0){
//            BigDecimal messagePrice=new BigDecimal("0.1");
//            BigDecimal phonePrice=new BigDecimal("0.1");
//            Boolean updateFlag=false;
//            if (deviceEntityVo.getIsMessage() && CollectionUtils.isNotEmpty(telephones)){
//                BigDecimal kc=new BigDecimal(telephones.size()).multiply(messagePrice);
//                if(balance.compareTo(kc)>0){
//                    log.info("----------------------------开始发送阿里云短信通知-------------------------");
//                    //封装短信内容
//                    String content="电量%s,信号%s,余额%s元";
//                    JSONObject senData=new JSONObject();
//                    senData.put("createTime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//                    senData.put("deviceName",deviceEntityVo.getDeviceName());
//                    senData.put("serialNumber",deviceEntityVo.getSerialNumber());
//                    senData.put("content",String.format(content,dto.getDumpEnergy(),dto.getSignalStrength(),deviceEntityVo.getBalance()));
//                    log.info("----------------------------开始发送阿里云短信通知-------------------------{}",senData.toJSONString());
//                    SmsMessageDto messageDto=new SmsMessageDto();
//                    messageDto.setTemplateKey("alarm");
//                    messageDto.setTemplateParam(senData.toJSONString());
//                    messageDto.setPhoneNumbers(String.join(",",telephones));
//                    //发送短信
//                    SendSmsResponse sendSmsResponse = commonService.sendSms(messageDto);
//                    log.info("----------------------------短信通知完成-------------------------");
//                    log.info("----------------------------短信通知返回信息-------------------------{}",sendSmsResponse);
//                    if (sendSmsResponse.getCode().equals("OK")){
//                        updateFlag=true;
//                        log.info("----------------------------短信通知balance111-------------------------{}",balance);
//                        log.info("----------------------------短信通知phonePrice-------------------------{}",phonePrice);
//                        log.info("----------------------------短信通知kc-------------------------{}",kc);
//                        balance=balance.subtract(kc);
//                        log.info("----------------------------短信通知balance222-------------------------{}",balance);
//                        DeviceNoticeRecord deviceNoticeRecord = saveNoticeRecord(dto, deviceEntityVo, 1, senData.toJSONString());
//                        commonService.updateBalance(deviceEntity,kc.negate(),deviceNoticeRecord.getId().toString(),3);
//                    }
//                }
//            }
//            if (deviceEntityVo.getIsPhone()  && CollectionUtils.isNotEmpty(telephones)){
//                BigDecimal kc=new BigDecimal(telephones.size()).multiply(phonePrice);
//                if(balance.compareTo(kc)>0){
//                    //封装短信内容
//                    String content="imei号码%s,电量%s,信号%s,余额%s元";
//                    JSONObject senData=new JSONObject();
//                    senData.put("deviceName",deviceEntityVo.getDeviceName());
//                    senData.put("content",String.format(content,dto.getSerialNumber(),dto.getDumpEnergy(),dto.getSignalStrength(),deviceEntityVo.getBalance()));
//                    log.info("----------------------------开始发送阿里云语音通知-------------------------{}",senData.toJSONString());
//                    //发送语音
//                    AliyunVoiceDto voiceDto=new AliyunVoiceDto();
//                    voiceDto.setTemplateKey("alarm");
//                    //发送语音
//                    voiceDto.setTtsParam(senData.toJSONString());
//                    voiceDto.setPhoneNumbers(telephones);
//                    int i = commonService.sendSingleCallToUser(voiceDto);
//                    log.info("----------------------------语音通知完成-------------------------");
//                    log.info("----------------------------语音通知返回信息-------------------------{}",i);
//                    if (i>0){
//                        updateFlag=true;
//                        log.info("----------------------------语音通知balance111-------------------------{}",balance);
//                        log.info("----------------------------语音通知phonePrice-------------------------{}",phonePrice);
//                        //实际扣除金额
//                        BigDecimal kc2 = phonePrice.multiply(new BigDecimal(i));
//                        log.info("----------------------------语音通知kc2-------------------------{}",kc2);
//                        balance=balance.subtract(kc2);
//                        log.info("----------------------------语音通知balance222-------------------------{}",balance);
//                        DeviceNoticeRecord deviceNoticeRecord = saveNoticeRecord(dto, deviceEntityVo, 2, senData.toJSONString());
//                        commonService.updateBalance(deviceEntity,kc2.negate(),deviceNoticeRecord.getId().toString(),4);
//                    }
//                }
//            }
//            //修改余额
//            log.info("----------------------------是否修改余额---------------------updateFlag={}----",updateFlag);
//            if (updateFlag){
//            log.info("----------------------------开始修改余额-------------------------");
//                DeviceEntity entity=new DeviceEntity();
//                entity.setId(deviceEntityVo.getId());
//                entity.setBalance(balance);
//                entity.setUpdateTime(new Date());
//                deviceEntityDao.updateById(entity);
//            }
//        }
        return null;
    }

    /**保存通知记录
     * type:报警类型0=微信 1=短信 2=电话*/
//    DeviceNoticeRecord saveNoticeRecord(SendMessageDto dto,DeviceEntityVo deviceEntityVo,Integer type,String sendData){
//        log.info("----------------------------生成通知记录 type-------------------------[{}]",type);
//        Snowflake snowflake=new Snowflake(1,1);
//        String telephone=CollectionUtils.isEmpty(deviceEntityVo.getTelephones())?null:String.join(",", deviceEntityVo.getTelephones());
//        log.info("----------------------------telephone-------------------------[{}]",telephone);
//        DeviceNoticeRecord noticeRecord=DeviceNoticeRecord.builder()
//                .id(snowflake.nextId())
//                .createTime(new Date())
//                .type(type)
//                .serialNumber(deviceEntityVo.getSerialNumber())
//                .iccid(deviceEntityVo.getIccid())
//                .userId(deviceEntityVo.getUserId())
//                .openid(deviceEntityVo.getOpenid())
//                .alarmId(dto.getAlarmId())
//                .content(sendData)
//                .telephone(telephone)
//                .build();
//        int insert = noticeRecordDao.insert(noticeRecord);
//        log.info("----------------------------受影响行数-------------------------[{}]",insert);
//        return noticeRecord;
//    }




}
